﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoDatos;
using Entidades.Negocio;
using Entidades;
using LogicaNegocios.Filtro;
using System.Data.EntityClient;

namespace LogicaNegocios
{
    static public class HablaFacilLN
    {
        static public HablaFacil agregarHablaFacil(this HablaFacil hablaFacilview)
        {
            try
            {
                MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
                HABLA_FACIL hablaFacil = hablaFacilview.toHABLA_FACIL();
                hablaFacil.CHRESTADO = Constantes.ESTADO_HABILITADO;

                if( hablaFacil.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_DIARIO)
                {
                    HABLA_FACIL hablaFacilaExistente = contexto.HABLA_FACIL.Where(h => h.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_DIARIO
                        && h.CHRESTADO == Constantes.ESTADO_HABILITADO
                        && h.DTMFECHA == hablaFacil.DTMFECHA).FirstOrDefault();
                    if (hablaFacilaExistente == null)
                    {
                        contexto.HABLA_FACIL.AddObject(hablaFacil);
                        contexto.SaveChanges();
                        return hablaFacil.toHablaFacil();
                    }
                    else
                    {
                        throw new Exception("Existe Habla Facil Diario registrado para esta Fecha");
                    }
                }
                else if (hablaFacil.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_MENSUAL)
                {
                    HABLA_FACIL hablaFacilaExistente = contexto.HABLA_FACIL.Where(h => h.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_MENSUAL
                        && h.CHRESTADO == Constantes.ESTADO_HABILITADO
                        && h.DTMFECHA.Value.Month == hablaFacil.DTMFECHA.Value.Month
                        && h.DTMFECHA.Value.Year == hablaFacil.DTMFECHA.Value.Year
                        ).FirstOrDefault();
                    if (hablaFacilaExistente == null)
                    {
                        contexto.HABLA_FACIL.AddObject(hablaFacil);
                        contexto.SaveChanges();
                        return hablaFacil.toHablaFacil();
                    }
                    else
                    {
                        throw new Exception("Existe Habla Facil Mensual registrado para esta Fecha");
                    }
                }
                else if (hablaFacil.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_ANUAL)
                {
                    HABLA_FACIL hablaFacilaExistente = contexto.HABLA_FACIL.Where(h => h.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_ANUAL
                        && h.CHRESTADO == Constantes.ESTADO_HABILITADO
                        && h.DTMFECHA.Value.Year == hablaFacil.DTMFECHA.Value.Year
                        ).FirstOrDefault();
                    if (hablaFacilaExistente == null)
                    {
                        contexto.HABLA_FACIL.AddObject(hablaFacil);
                        contexto.SaveChanges();
                        return hablaFacil.toHablaFacil();
                    }
                    else
                    {
                        throw new Exception("Existe Habla Facil Anual registrado para esta Fecha");
                    }
                }

                return null;
            }
            catch( Exception e)
            {
                throw e;
            }
        }

        static public void modificarHablaFacil(this HablaFacil hablafacilview)
        {
            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
            HABLA_FACIL hablaFacil = contexto.HABLA_FACIL.Where(hf => hf.INTCODHABLAFACIL == hablafacilview.INTCODHABLAFACIL).FirstOrDefault();
            hablaFacil.INTREPORTADO = hablafacilview.INTREPORTADO;
            hablaFacil.INTREPORTADOPROGRAMADO = hablafacilview.INTREPORTADOPROGRAMADO;
            hablaFacil.INTLEVANTADO = hablafacilview.INTLEVANTADO;
            hablaFacil.INTLEVANTADOPROGRAMADO = hablafacilview.INTLEVANTADOPROGRAMADO;
            hablaFacil.INTPENDIENTE = hablafacilview.INTPENDIENTE;
            hablaFacil.INTPENDIENTEPROGRAMADO = hablafacilview.INTPENDIENTEPROGRAMADO;
            hablaFacil.CHRESTADO = Constantes.ESTADO_HABILITADO;
            hablaFacil.VCHUSUARIOMODIFICACION = hablafacilview.VCHUSUARIOMODIFICACION;
            hablaFacil.DTMFECHA = Funciones.StringToDate(hablafacilview.Fecha);
            hablaFacil.DTMFECHAMODIFICACION = DateTime.Now;
            hablaFacil.VCHUSUARIOCREACION = hablafacilview.VCHUSUARIOCREACION;
            contexto.SaveChanges();
        }

        static public void eliminarHablaFacil(this HablaFacil hablafacilview)
        {
            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
            HABLA_FACIL hablaFacil = contexto.HABLA_FACIL.Where(hf => hf.INTCODHABLAFACIL == hablafacilview.INTCODHABLAFACIL).FirstOrDefault();
            hablaFacil.CHRESTADO = Constantes.ESTADO_ELIMINADO;
            hablaFacil.VCHUSUARIOMODIFICACION = hablaFacil.VCHUSUARIOMODIFICACION;
            hablaFacil.DTMFECHAMODIFICACION = hablaFacil.DTMFECHAMODIFICACION;
            contexto.SaveChanges();
        }

        static public List<HablaFacil> listarHablaFacil(this FiltroHablaFacil filtroHablaFacil)
        {
            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();

            DateTime desde = Funciones.StringToDate(filtroHablaFacil.FechaDesde);
            //DateTime desde = new DateTime(filtroDesdeDate.Year, filtroDesdeDate.Month, filtroDesdeDate.Day,0,0,0);

            DateTime filtroHastaDate = Funciones.StringToDate(filtroHablaFacil.FechaHasta);
            DateTime hasta = new DateTime(filtroHastaDate.Year, filtroHastaDate.Month, filtroHastaDate.Day, 23, 59, 59);

            List<HABLA_FACIL> listaHABLA_FACIL = contexto.HABLA_FACIL.Where(hf => hf.INTCODTIPOHABLAFACIL == filtroHablaFacil.TipoHablaFacil
                && hf.DTMFECHA >= desde && hf.DTMFECHA <= hasta && hf.CHRESTADO == Constantes.ESTADO_HABILITADO).ToList();
            List<HablaFacil> listaHablaFacil = new List<HablaFacil>();
            foreach (HABLA_FACIL hablaFacil in listaHABLA_FACIL)
            {
                listaHablaFacil.Add(hablaFacil.toHablaFacil());
            }
            return listaHablaFacil;
        }

        static public List<HablaFacil> listarHablaFacilReporte()
        {
            String anio = DateTime.Now.Year.ToString();
            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
            List<HablaFacil> listaHablaFacilTmp = new List<HablaFacil>();
            List<HABLA_FACIL> listaHablaFacil = contexto.HABLA_FACIL.Where(hb => hb.CHRESTADO == Constantes.ESTADO_HABILITADO
                && hb.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_MENSUAL
                && hb.DTMFECHA.Value.Year == DateTime.Now.Year ).OrderBy( hb => hb.DTMFECHA).ToList();

            foreach(HABLA_FACIL hablaFacil in listaHablaFacil)
            {
                if (hablaFacil.INTLEVANTADO == 0)
                {
                    using (EntityConnection econ = new EntityConnection("name=MILPO_VIDEOS_Entities"))
                    {
                        econ.Open();
                        EntityCommand ecom = econ.CreateCommand();
                        //, HB.DTMFECHA
                        String query = "SELECT SUM(HB.INTREPORTADO),SUM(HB.INTLEVANTADO),SUM(HB.INTPENDIENTE)" +
                        " FROM MILPO_VIDEOS_Entities.HABLA_FACIL AS HB WHERE HB.CHRESTADO = '" + Constantes.ESTADO_HABILITADO +
                        "' AND HB.INTCODTIPOHABLAFACIL = "+ Constantes.HABLA_FACIL_MENSUAL +
                        " AND YEAR(HB.DTMFECHA) = " + anio +
                        " AND MONTH(HB.DTMFECHA) = " + hablaFacil.DTMFECHA.Value.Month.ToString();

                        ecom.CommandText = query;
                        using (EntityDataReader rdr = ecom.ExecuteReader(System.Data.CommandBehavior.SequentialAccess | System.Data.CommandBehavior.CloseConnection))
                        {
                            while (rdr.Read())
                            {
                                hablaFacil.INTREPORTADO = rdr.GetInt32(0);
                                hablaFacil.INTLEVANTADO = rdr.GetInt32(1);
                                hablaFacil.INTPENDIENTE = rdr.GetInt32(2);
                            }
                        }
                    }
                }
                listaHablaFacilTmp.Add(hablaFacil.toHablaFacil());
            }



            return listaHablaFacilTmp;

        }

        static public HablaFacil obtenerHablaFacil(this FiltroHablaFacil hablafacilview)
        {
            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
            HABLA_FACIL hablaFacil = contexto.HABLA_FACIL.Where(hf => hf.INTCODHABLAFACIL == hablafacilview.id).FirstOrDefault();
            return hablaFacil.toHablaFacil();
        }

        static public HablaFacil obtenerHablaFacilReproductor(int tipoHablaFacil)
        {

            MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities();
            HABLA_FACIL hablaFacilUltimo = contexto.HABLA_FACIL.Where(h => h.INTCODTIPOHABLAFACIL == tipoHablaFacil
                && h.CHRESTADO == Constantes.ESTADO_HABILITADO
                ).OrderByDescending(d => d.DTMFECHA).FirstOrDefault();
            if (hablaFacilUltimo == null)
            {
                hablaFacilUltimo = new HABLA_FACIL();
            }
            else
            {
                if (tipoHablaFacil != Constantes.HABLA_FACIL_DIARIO)
                {
                    if (hablaFacilUltimo.INTLEVANTADO == 0)
                    {
                        //Si es 0 se calcula de los días
                        int diasAdvertencia = 0;
                        String fechaTmp = Funciones.DateToString(hablaFacilUltimo.DTMFECHA);
                        int INTLEVANTADOPROGRAMADO = hablaFacilUltimo.INTLEVANTADOPROGRAMADO.Value;
                        int INTPENDIENTEPROGRAMADO = hablaFacilUltimo.INTPENDIENTEPROGRAMADO.Value;
                        int INTREPORTADOPROGRAMADO = hablaFacilUltimo.INTREPORTADOPROGRAMADO.Value;

                        HablaFacil hablaFacilTmp = HablaFacilLN.obtenerHablaFacilReproductorPromedio(tipoHablaFacil, Funciones.DateToString(DateTime.Now), ref diasAdvertencia);
                        hablaFacilTmp.Fecha = fechaTmp;
                        hablaFacilTmp.INTLEVANTADOPROGRAMADO = INTLEVANTADOPROGRAMADO;
                        hablaFacilTmp.INTPENDIENTEPROGRAMADO = INTPENDIENTEPROGRAMADO;
                        hablaFacilTmp.INTREPORTADOPROGRAMADO = INTREPORTADOPROGRAMADO;

                        return hablaFacilTmp;
                    }
                }
            }
            return hablaFacilUltimo.toHablaFacil();

        }

        static public HablaFacil obtenerHablaFacilReproductorPromedio(int tipoHablaFacil, String fechaSeleccionadaTmp, ref int diasAdvertencia)
        {
            DateTime fechaSeleccionada = Funciones.StringToDate(fechaSeleccionadaTmp);
            HablaFacil hablaFacil = new HablaFacil();
            if (tipoHablaFacil == Constantes.HABLA_FACIL_DIARIO)
            { 

                using (MILPO_VIDEOS_Entities contexto = new MILPO_VIDEOS_Entities())
                {
                    try
                    {
                        HABLA_FACIL hablaFacilPromedio = contexto.HABLA_FACIL.Where(h => h.INTCODTIPOHABLAFACIL == Constantes.HABLA_FACIL_MENSUAL
                            && h.DTMFECHA.Value.Month == fechaSeleccionada.Month
                            && h.DTMFECHA.Value.Year == fechaSeleccionada.Year
                            && h.CHRESTADO == Constantes.ESTADO_HABILITADO
                        ).FirstOrDefault();
                        if (hablaFacilPromedio != null)
                            hablaFacil = hablaFacilPromedio.toHablaFacil();

                        PARAMETRO parametro = contexto.PARAMETRO.Where(p => p.INTCODPARAMETRO == 1).FirstOrDefault();
                        diasAdvertencia = Convert.ToInt32(parametro.VCHVALOR); //LEVANTADO ES COMODIN
                    }
                    catch (Exception)
                    { 
                        
                    }
                }
            }
            else
            {
                String mes = fechaSeleccionada.Month.ToString();
                String anio = fechaSeleccionada.Year.ToString();
                hablaFacil = new HablaFacil();

                using (EntityConnection econ = new EntityConnection("name=MILPO_VIDEOS_Entities"))
                {
                    econ.Open();
                    EntityCommand ecom = econ.CreateCommand();
                    String query = "SELECT SUM(HB.INTREPORTADO),SUM(HB.INTLEVANTADO),SUM(HB.INTPENDIENTE)" +
                    " FROM MILPO_VIDEOS_Entities.HABLA_FACIL AS HB WHERE HB.CHRESTADO = '" + Constantes.ESTADO_HABILITADO +
                    "' AND YEAR(HB.DTMFECHA) = " + anio;

                    if (Constantes.HABLA_FACIL_MENSUAL == tipoHablaFacil)
                    {
                        query += " AND HB.INTCODTIPOHABLAFACIL = " + Constantes.HABLA_FACIL_DIARIO;
                        query += " AND MONTH(HB.DTMFECHA) = " + mes + " ";
                    }
                    else if (Constantes.HABLA_FACIL_ANUAL == tipoHablaFacil)
                    {
                        query += " AND HB.INTCODTIPOHABLAFACIL = " + Constantes.HABLA_FACIL_DIARIO;
                    }
                
                    ecom.CommandText = query;
                    using (EntityDataReader rdr = ecom.ExecuteReader(System.Data.CommandBehavior.SequentialAccess | System.Data.CommandBehavior.CloseConnection))
                    {
                        while (rdr.Read())
                        {
                            hablaFacil.INTREPORTADO = rdr.GetInt32(0);
                            hablaFacil.INTLEVANTADO = rdr.GetInt32(1);
                            hablaFacil.INTPENDIENTE = rdr.GetInt32(2);
                        }
                    }
                }
            }
            return hablaFacil;
            //MENSUAL PROMEDIO DE TODOS LOS DIARIOS EN EL MES
            //ANUAL PROMEDIO DE TODOS LOS MESES EN EL ANIO
        }

    }
}
